package com.idroc.storage;

/**
 * IO分页管理器
 * 备注: IO分页管理的IO分页状态分两种: 空闲页 和 使用页
 *       IO分页管理将分页以单向链表方式组织. 
 *       可以存在多个单向链表, 根据入口编号区别各个单向链表.
 *       所有的空闲页组织在一个单向链表, 使用页组织在多个单向链表, 以入口编号定位第一个IO分页
 * @author yuyoo (yuyoo4j@163.com)
 * @date 2010-3-30 上午10:29:16
 */
public interface IoPageManager {
	
	/**
	 * 获取空闲页单向链表的入口编号
	 * @param pageType -- IO分页类型
	 * @return -- 入口编号
	 */
	int getFreeRootNo(short pageType);

	/**
	 * 根据IO分页入口编号去获取单向链表第一个IO分页
	 * @param pageType -- IO分页类型
	 * @param rootNo -- 入口编号 
	 * @return -- IO分页
	 */
	IoPage getRootPage(short pageType, int rootNo);
		
	/**
	 * 获取特定IO分页类型的空闲页
	 * @param pageType -- IO分页类型 
	 * @return -- 空闲IO分页
	 */
	IoPage peekFreePage(short pageType);
	
	/**
	 * 获取指定IO分页类型的空闲页
	 * 备注: 将改变空闲页状态为使用页
	 * @param pageType -- IO分页类型
	 * @param usedRootNo -- 使用页单向链表入口编号
	 * @return -- 指定类型的IO分页
	 */
	IoPage takeFreePage(short pageType, int usedRootNo);
	
	/**
	 * 根据IO分页ID获取IO分页
	 * @param pageId -- IO分页ID
	 * @return -- IO分页
	 */
	IoPage getUsedPage(long pageId);
	
	/**
	 * 释放指定使用页
	 * @param pageId -- IO分页ID
	 */
	void releaseUsedPage(long pageId);
	
	/**
	 * 释放指定单向链表所在的所有使用页
	 * @param pageType -- IO分页类型
	 * @param rootNo -- 入口编号
	 */
	void releaseUsedPage(short pageType, int rootNo);
	
	/**
	 * 获取指定单向链表的第一个IO分页ID
	 * @param pageType -- IO分页类型
	 * @param rootNo -- 入口编号
	 * @return -- IO分页ID
	 */
	long getFirstPageId(short pageType, int rootNo);
	
	/**
	 * 获取指定单向链表的第后一个IO分页ID
	 * @param pageType -- IO分页类型
	 * @param rootNo -- 入口编号
	 * @return -- IO分页ID
	 */
	long getLastPageId(short pageType, int rootNo);
	
	/**
	 * 每个IO块文件的最大字节数
	 * @return -- 字节数
	 */
	long maxSizePerIoBlockFile();
	
	/**
	 * 每个IO分页类型最大IO块文件数量
	 * @return -- IO块文件数量
	 */
	short maxIoBlockFilesPerType();
	
	/**
	 * 指定类型的每个IO块文件最大IO分页数量
	 * @param pageType -- IO分页类型
	 * @return -- IO分页数量
	 */
	long maxPagesPerIoBlockFile(short pageType);
}
